#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <sys/wait.h>
using namespace std;

// SIGCHLD

void CleanChild(int sig)
{
    // // v1    只能回收单个子进程，不能回收多个子进程，因为信号只能被未决1次
    // if (sig == SIGCHLD)
    // {
    //     pid_t rid = waitpid(-1, nullptr, 0);
    //     if (rid > 0)
    //     {
    //         cout << "wait child success, id: " << rid << endl;
    //     }
    // }
    // cout << "wait sub process done..." << endl;

    // // v2   一部分子进程没有退出 就会一直阻塞等待
    // if (sig == SIGCHLD)
    // {
    //     while (true)
    //     {
    //         pid_t rid = waitpid(-1, nullptr, 0);
    //         if (rid > 0)
    //         {
    //             cout << "wait child success, id: " << rid << endl;
    //         }
    //         //阻塞等待时，没有子进程了就会返回-1
    //         else if (rid <= 0)
    //         {
    //             break;
    //         }
    //     }
    // }
    // cout << "wait sub process done..." << endl;

     // v3   50个退出 50个没退出
    if (sig == SIGCHLD)
    {
        while (true)
        {
            pid_t rid = waitpid(-1, nullptr, WNOHANG);
            if (rid > 0)
            {
                cout << "wait child success, id: " << rid << endl;
            }
            else if (rid == 0)  //还有子进程没有退出
            {
                break;
            }
            else if (rid < 0)   //没有子进程了
            {
                break;
            }
        }
    }
    cout << "wait sub process done..." << endl;
}
int main()
{
    //signal(SIGCHLD, CleanChild);
    signal(SIGCHLD, SIG_IGN);
    // 创建100个子进程
    for (int i = 0; i < 100; i++)
    {
        pid_t id = fork();
        if (id == 0)
        {
            // child
            int cnt = 5;
            while (cnt)
            {
                cout << "I am child, pid: " << getpid() << endl;
                cnt--;
                // sleep(1);
            }
            exit(0);
        }
    }
    // father
    while (true)
        sleep(1);
    return 0;
}

// void Print(sigset_t &set)
// {
//     for (int i = 31; i >= 1; i--)
//     {
//         if (sigismember(&set, i))
//         {
//             cout << "1";
//         }
//         else
//         {
//             cout << "0";
//         }
//     }
//     cout << endl;
// }

// void handler(int sig)
// {
//     cout << "signal: " << sig << endl;
//     //不断获取pending位图 观察哪些信号处于未决状态
//     sigset_t pending;
//     sigemptyset(&pending);

//     while (true)
//     {
//          sigpending(&pending);
//          Print(pending);
//          sleep(1);
//     }

// }
// int main()
// {
//     struct sigaction act, oact;
//     act.sa_handler = handler;
//     act.sa_flags = 0;
//     sigemptyset(&act.sa_mask);
//     //处理2号信号时，屏蔽3、4、5号信号
//     sigaddset(&act.sa_mask, 3);
//     sigaddset(&act.sa_mask, 4);
//     sigaddset(&act.sa_mask, 5);
//     sigaction(2, &act, &oact);

//     while (true) sleep(1);
//     return 0;
// }